/**
* Copyright 2015 Red Hat, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* The Apache License v2.0 is available at
* http://www.opensource.org/licenses/apache2.0.php
*
* You may elect to redistribute this code under either of these licenses.
*/
package io.vertx.test.redis;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonObject;
import io.vertx.redis.RedisClient;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class PubSubTest extends AbstractRedisClientBase {
@Test
public void testPubSub() {
final String message = makeKey();
// register a handler for the incoming message
vertx.eventBus().consumer("io.vertx.redis.ch1", (Message<JsonObject> msg) -> {
JsonObject value = msg.body().getJsonObject("value");
assertEquals("ch1", value.getString("channel"));
assertEquals(message, value.getString("message"));
testComplete();
});
// on sub address subscribe to channel ch1
redis.subscribe("ch1", subscribe -> {
assertTrue(subscribe.succeeded());
assertEquals("subscribe", subscribe.result().getValue(0));
assertEquals("ch1", subscribe.result().getValue(1));
assertEquals(1l, subscribe.result().getValue(2));
// on pub address publish a message
redis.publish("ch1", message, res -> {
assertTrue(res.succeeded());
assertEquals(Long.valueOf(1l), res.result());
});
});
await();
}
@Test
public void testPubSubPattern() {
final String worldNews = "hello world";
final String technologyNews = "hello vertx";
final List<JsonObject> inbox = new ArrayList<>();
// register a handler for all incoming messages
vertx.eventBus().consumer("io.vertx.redis.news.*", (Message<JsonObject> msg) -> {
inbox.add(msg.body().getJsonObject("value"));
if (inbox.size() == 2) {
if (
(worldNews.equals(inbox.get(0).getString("message")) && technologyNews.equals(inbox.get(1).getString("message"))) ||
(worldNews.equals(inbox.get(1).getString("message")) && technologyNews.equals(inbox.get(0).getString("message")))) {
testComplete();
}
}
});
// on sub address subscribe to channels news.*
redis.psubscribe("news.*", subscribe -> {
assertTrue(subscribe.succeeded());
assertEquals("psubscribe", subscribe.result().getValue(0));
assertEquals("news.*", subscribe.result().getValue(1));
assertEquals(1l, subscribe.result().getValue(2));
// on pub address publish a message to news.wold
redis.publish("news.world", worldNews, r0 -> {
assertTrue(r0.succeeded());
assertEquals(1l, r0.result().longValue());
});
// on pub address publish a message to news.wold
redis.publish("news.technology", technologyNews, r0 -> {
assertTrue(r0.succeeded());
assertEquals(1l, r0.result().longValue());
});
});
await();
}
@Test
public void testLateJoin() {
final String message = makeKey();
final AtomicInteger cnt = new AtomicInteger(0);
// register a handler for the incoming message
vertx.eventBus().consumer("io.vertx.redis.ch2", (Message<JsonObject> msg) -> {
JsonObject value = msg.body().getJsonObject("value");
assertEquals("ch2", value.getString("channel"));
assertEquals(message, value.getString("message"));
if (cnt.incrementAndGet() == 2) {
testComplete();
}
});
// on sub address subscribe to channel ch2
redis.subscribe("ch2", subscribe -> {
assertTrue(subscribe.succeeded());
assertEquals("subscribe", subscribe.result().getValue(0));
assertEquals("ch2", subscribe.result().getValue(1));
assertEquals(1l, subscribe.result().getValue(2));
// deploy a new sub
RedisClient redis2 = RedisClient.create(vertx, getConfig());
// on sub address subscribe to channel ch2
redis2.subscribe("ch2", subscribe2 -> {
assertTrue(subscribe2.succeeded());
assertEquals("subscribe", subscribe2.result().getValue(0));
assertEquals("ch2", subscribe2.result().getValue(1));
assertEquals(1l, subscribe2.result().getValue(2));
// on pub address publish a message
redis2.publish("ch2", message, r0 -> {
assertTrue(r0.succeeded());
assertEquals(2l, r0.result().longValue());
});
});
});
await();
}
}